package com.lipuwater.agent.ble.utils;

import java.util.ArrayList;
import java.util.List;

/**
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃永无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * Created by  Administrator  on 2016/12/20.
 * Email:924686754@qq.com
 * 此类负责通信协议byte[]数据解析
 */
public class ByteParsing {
    public static final int PACKAGEHEAD = -1;//0xff


    /**
     * 判断设备按钮是否按下
     * FF FF 07 01 30 02 00 01 6C 53
     *
     * @param value 设备回调的数据
     */
    public static boolean getDeviceConfirmState(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) {
                return false;
            }
            if (valueStr.substring(14, 16).equals("01")) {//01表示已经按下
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断设备是否激活
     *
     * @param value 设备回调的数据
     */
    public static boolean getDeviceState(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) {
                return false;
            }
            if (valueStr.substring(12, 14).equals("01")) {//00表示已经激活
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }


    /**
     * 判断写入设备主板编码是否成功
     *
     * @param value
     * @return
     */
    public static boolean WriteMainCodeSuccess(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("10") || valueStr.length() == 16) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断写入设备剩余天数是否成功
     *
     * @param value
     * @return
     */
    public static boolean WriteDeciceHaveDaySuccess(byte[] value) {
        try {
            if (value == null || value.length == 0) {
                return false;
            }
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("15") || valueStr.length() == 16) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取设备暂停天数数据点数
     *
     * @param value
     * @return
     */
    public static Byte getDeviceStopDayPoints(byte[] value) {
        try {
            if (value == null || value.length == 0) {
                return null;
            }
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            return value[31];
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取设备历史数据点数
     * 注意这里读取的应该是设备地址从31000-31026
     * index 取第几个
     *
     * @return
     */
    public static Byte getDeviceHistoryPoints(byte[] value) {
        try {
            if (value == null || value.length == 0) {
                return null;
            }
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            return value[30];
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 判断清除设备历史数据是否成功
     *
     * @param value
     * @return
     */
    public static boolean CleanDeciceHistoryDataSuccess(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码20
            if (!functionCode.equals("20") || valueStr.length() == 16) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取有效数据段给服务器
     * 30指令
     * retrieveFF 是否检索去掉ff
     *
     * @param value
     */
    public static byte[] getValidData30(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.length - 7];
            for (int i = 5; i < value.length - 2; i++) {
                bytes[i - 5] = value[i];
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    public static byte[] getValidData30(List<Byte> value, boolean retrieveFF) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("30") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.size() - 7];
            for (int i = 5; i < value.size() - 2; i++) {
                bytes[i - 5] = value.get(i);
                if (retrieveFF && value.get(i) == PACKAGEHEAD) {
                    i++;
                }
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }


    /**
     * 获取有效数据段给服务器
     * 35指令
     * 虽然30和35一样 不过还是分开吧，鬼知道后面会不会只变35的
     *
     * @param value
     */
    public static byte[] getValidData35(byte[] value, boolean retrieveFF) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("35") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.length - 7];
            for (int i = 5; i < value.length - 2; i++) {
                bytes[i - 5] = value[i];
                if (retrieveFF && value[i] == PACKAGEHEAD) {
                    i++;
                }
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    public static byte[] getValidData35(List<Byte> value, boolean retrieveFF) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("35") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.size() - 7];
            for (int i = 5; i < value.size() - 2; i++) {
                bytes[i - 5] = value.get(i);
                if (retrieveFF && value.get(i) == PACKAGEHEAD) {
                    i++;
                }
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取有效数据段给服务器
     * 40指令
     * 虽然40和35一样 不过还是分开吧，鬼知道后面会不会只变40的
     *
     * @param value
     */
    public static byte[] getValidData40(byte[] value, boolean retrieveFF) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("40") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.length - 7];
            for (int i = 5; i < value.length - 2; i++) {
                bytes[i - 5] = value[i];
                if (retrieveFF && value[i] == PACKAGEHEAD) {
                    i++;
                }
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    public static byte[] getValidData40(List<Byte> value, boolean retrieveFF) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("40") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            byte[] bytes = new byte[value.size() - 7];
            for (int i = 5; i < value.size() - 2; i++) {
                bytes[i - 5] = value.get(i);
                if (retrieveFF && value.get(i) == PACKAGEHEAD) {
                    i++;
                }
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取暂停天数有效数据给服务器
     *
     * @param value
     * @return
     */
    public static List<Byte> getStopDayData(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("45") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            List<Byte> bytes = new ArrayList<>();
            for (int i = 5; i < value.length - 2; i++) {
                bytes.add(value[i]);
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取历史数据有效数据给服务器
     *
     * @param value
     * @return
     */
    public static List<Byte> getHistoryData(byte[] value) {
        try {
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码30
            if (!functionCode.equals("40") || valueStr.length() == 16) { //认为数据长度不符
                return null;
            }
            List<Byte> bytes = new ArrayList<>();
            for (int i = 5; i < value.length - 2; i++) {
                bytes.add(value[i]);
            }
            return bytes;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 判断滤芯复位是否成功
     *
     * @param value
     * @return
     */
    public static boolean getFilterResetState(byte[] value) {
        try {
            if (value == null || value.length == 0) {
                return false;
            }
            String valueStr = ByteUtils.toHexString(value);
            String functionCode = valueStr.substring(8, 10);//功能码20
            if (!functionCode.equals("20") || valueStr.length() == 16) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
